package git.soulbgm.common;

import git.soulbgm.config.RemoteParamConfig;
import git.soulbgm.utils.JsonTool;
import git.soulbgm.utils.LogHelper;
import git.soulbgm.utils.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.Map;

/**
 * 远程配置参数操作
 *
 * @author SoulBGM
 * @date 2022/10/09 18:17
 */
@Component
public class RemoteParamOperate {

    private final LogHelper log = new LogHelper(RemoteParamOperate.class);

    @Autowired
    private RemoteParamConfig config;

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 获取远程参数的父级URL
     */
    private static final String BASE_URL = "system/config/get";

    /**
     * 获得响应内容
     *
     * @param name 参数名字
     * @return {@link String}
     */
    private String getResponse(String name) {
        final List<String> servers = config.getServers();
        for (String server : servers) {
            try {
                return restTemplate.getForObject(StringUtil.format("http://{}/{}/{}", server, BASE_URL, name), String.class);
            } catch (Exception e) {
                log.error("访问远程配置参数发生异常", e);
            }
        }
        return null;
    }

    /**
     * 获得实体参数
     *
     * @param name   参数名字
     * @param tClass 实体的Class
     * @return {@link T}
     */
    public <T> T getObj(String name, Class<T> tClass) {
        String content = getResponse(name);
        if (content != null) {
            return JsonTool.parse(content, tClass);
        }
        return null;
    }

    /**
     * 获得列表参数
     *
     * @param name   参数名字
     * @param tClass 列表泛型的Class
     * @return {@link List}<{@link T}>
     */
    public <T> List<T> getList(String name, Class<T> tClass) {
        String content = getResponse(name);
        if (content != null) {
            return JsonTool.parseArray(content, tClass);
        }
        return null;
    }

    /**
     * 获得Map参数
     *
     * @param name 参数名字
     * @return {@link Map}<{@link String}, {@link Object}>
     */
    public Map<String, Object> getMap(String name) {
        String content = getResponse(name);
        if (content != null) {
            return JsonTool.parse(content);
        }
        return null;
    }

    /**
     * 获得字符串参数
     *
     * @param name 参数名字
     * @return {@link String}
     */
    public String getStr(String name) {
        return getResponse(name);
    }
}
